﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web.UI;
using System.Web.UI.WebControls;
using PortalCurriculo.Domain;
using PortalCurriculo.Util.Translation;
using PortalCurriculo.WebUI.Helpers;

namespace PortalCurriculo.WebUI.UserControls.Curriculo
{
    public partial class Especializacao : Curriculo
    {
        public List<Domain.Especializacao> Especializacoes { private get; set; }
        public TipoEspecializacao TipoEspecializacao { get; set; }
        public Domain.Curriculo Curriculo { get; set; }

        public string ValidationGroup
        {
            get { return txtInstituicao.ValidationGroup; }
            set
            {
                txtInstituicao.ValidationGroup = txtDescricao.ValidationGroup = txtTitulo.ValidationGroup =
                                                                                dataFinal.ValidationGroup =
                                                                                dataInicio.ValidationGroup =
                                                                                btnSalvar.ValidationGroup = value;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack) return;

            ValidationGroup = string.Concat("ValidationEspecializacao", TipoEspecializacao.Id);
            bool temNivelEspecializacao = PreencherNivelEspecializacao();
            PreencherListView(temNivelEspecializacao);
            lnkAdicionar.Visible =imbAdicionar.Visible = IdUsuario == UsuarioLogado.Id;
            lblTipoEspecializacaoEdicao.Text = lblTipoEspecializacao.Text = TipoEspecializacao.Descricao;
        }

        private bool PreencherNivelEspecializacao()
        {
            var niveis = new NivelEspecializacao {IdTipoEspecializacao = TipoEspecializacao.Id}.SelecionarPorTipoEspecializacao();

            if (niveis.Count == 0) return false;

            ddlNivelEspecializacao.DataTextField = "Descricao";
            ddlNivelEspecializacao.DataValueField = "Id";
            ddlNivelEspecializacao.DataSource = niveis;
            ddlNivelEspecializacao.DataBind();

            pnlNivelEspecializacao.Visible = true;
            return true;
        }

        private void PreencherListView(bool temNivelEspecializacao)
        {
            if ((Especializacoes == null || Especializacoes.Count == 0) && IdUsuario != UsuarioLogado.Id)
            {
                Visible = false;
                return;
            }

            lsvEspecializacao.DataSource = temNivelEspecializacao
                                               ? Especializacoes.OrderByDescending(
                                                   esp => esp.NivelEspecializacao.NivelEscolaridade).ThenByDescending(
                                                       esp => esp.DataInicio).ToList()
                                               : Especializacoes.OrderByDescending(esp => esp.DataInicio).ToList();
            lsvEspecializacao.DataBind();
        }

        protected void lsvEspecializacao_ItemDataBound(object sender, ListViewItemEventArgs e)
        {
            var item = (ListViewDataItem) e.Item;
            var especializacaoCurriculo = (Domain.Especializacao) item.DataItem;

            ((Label) item.FindControl("lblDescricao")).Text = especializacaoCurriculo.Descricao;
            ((Label) item.FindControl("lblInstituicao")).Text = especializacaoCurriculo.Instituicao;
            ((Label) item.FindControl("lblTitulo")).Text = especializacaoCurriculo.Titulo;
            ((Label) item.FindControl("lblNivelEspecializacao")).Text = especializacaoCurriculo.NivelEspecializacao !=
                                                                        null
                                                                            ? especializacaoCurriculo.
                                                                                  NivelEspecializacao.Descricao
                                                                            : null;
            item.FindControl("pnlNivelEspecializacaoFixo").Visible = especializacaoCurriculo.NivelEspecializacao != null;

            DateTimeFormatInfo dateTimeFormat = CultureHelper.Cultura.DateTimeFormat;
            string mesInicio =
                CultureHelper.Cultura.TextInfo.ToTitleCase(
                    dateTimeFormat.GetMonthName(especializacaoCurriculo.DataInicio.Month));
            string mesFinal = especializacaoCurriculo.DataFinal != null
                                  ? CultureHelper.Cultura.TextInfo.ToTitleCase(
                                      dateTimeFormat.GetMonthName(especializacaoCurriculo.DataFinal.Value.Month))
                                  : Translator.TranslateMessage(Messages.Atual, AppRelativeVirtualPath);

            ((Label) item.FindControl("lblPeriodo")).Text = string.Concat(mesInicio, "/",
                                                                          especializacaoCurriculo.DataInicio.Year, " - ",
                                                                          mesFinal);
            if (especializacaoCurriculo.DataFinal != null)
                ((Label) item.FindControl("lblPeriodo")).Text += string.Concat("/",
                                                                               especializacaoCurriculo.DataFinal.Value.
                                                                                   Year);

            ConfigurarBotoes(item, especializacaoCurriculo.Id.ToString());
        }

        protected void imbExcluir_Click(object sender, ImageClickEventArgs e)
        {
            var id = int.Parse(((ImageButton)sender).CommandArgument);

            var especializacao = (from espec in Especializacoes
                                  where espec.Id.Equals(id)
                                  select espec).FirstOrDefault();

            Especializacoes.Remove(especializacao);
            especializacao.Delete();

            PreencherListView(pnlNivelEspecializacao.Visible);
            AtualizarCurriculo();
        }

        private void AtualizarCurriculo()
        {
            if (Curriculo == null && IdCurriculo != 0)
                Curriculo = new Domain.Curriculo().SelectById<Domain.Curriculo>(IdCurriculo);

            if (Curriculo == null) return;

            Curriculo.DataUltimaAtualizacao = DateTime.Now;
            Curriculo.Save();
        }

        protected void imbEditar_Click(object sender, ImageClickEventArgs e)
        {
            LimparCampos();

            var id = int.Parse(((ImageButton) sender).CommandArgument);

            var especializacao = (from espec in Especializacoes
                                  where espec.Id.Equals(id)
                                  select espec).FirstOrDefault();

            txtDescricao.Value = especializacao.Descricao;
            txtInstituicao.Value = especializacao.Instituicao;
            txtTitulo.Value = especializacao.Titulo;
            lblTipoEspecializacaoEdicao.Text = especializacao.TipoEspecializacao.Descricao;
            dataInicio.Value = especializacao.DataInicio;
            dataFinal.Value = especializacao.DataFinal;
            hdnId.Value = id.ToString();
            if (especializacao.IdNivelEspecializacao != null)
                ddlNivelEspecializacao.SelectedValue = especializacao.IdNivelEspecializacao.Value.ToString();

            Popup.Show();
        }

        private void LimparCampos()
        {
            txtDescricao.Value = string.Empty;
            txtInstituicao.Value = string.Empty;
            txtTitulo.Value = string.Empty;
            lblTipoEspecializacaoEdicao.Text = string.Empty;
            dataInicio.Value = null;
            dataFinal.Value = null;
            hdnId.Value = string.Empty;

            lblTipoEspecializacaoEdicao.Text = TipoEspecializacao.Descricao;
        }

        protected void lnkCancelar_Click(object sender, EventArgs e)
        {
            Popup.Close();
        }

        protected void lnkSalvar_Click(object sender, EventArgs e)
        {
            var especializacao = string.IsNullOrEmpty(hdnId.Value)
                                     ? new Domain.Especializacao()
                                     : Especializacoes.Where(esp => esp.Id == int.Parse(hdnId.Value)).FirstOrDefault();

            especializacao.Ativo = true;
            especializacao.DataFinal = dataFinal.Value;
            especializacao.DataInicio = dataInicio.Value.Value;
            especializacao.Descricao = txtDescricao.Value;
            especializacao.IdCurriculo = IdCurriculo;
            especializacao.IdTipoEspecializacao = TipoEspecializacao.Id;
            especializacao.Instituicao = txtInstituicao.Value;
            especializacao.Titulo = txtTitulo.Value;
            especializacao.IdNivelEspecializacao = pnlNivelEspecializacao.Visible
                                                       ? (int?) int.Parse(ddlNivelEspecializacao.SelectedValue)
                                                       : null;
            especializacao.Save();

            if (string.IsNullOrEmpty(hdnId.Value))
                Especializacoes.Add(especializacao);

            PreencherListView(pnlNivelEspecializacao.Visible);
            Popup.Close();
            AtualizarCurriculo();
        }

        protected void lnkAdicionar_Click(object sender, EventArgs e)
        {
            LimparCampos();
            Popup.Show();
        }
    }
}